package Utils.word;

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;

/**
 * @author d11yu
 */
public final class EasyPoiUtils {
    /**
     * 导出word（在web环境下）
     * <p>第一步生成替换后的word文件，只支持docx</p>
     * <p>第二步下载生成的文件</p>
     * <p>第三步删除生成的临时文件</p>
     * 模版变量中变量格式：{{foo}}
     *
     * @param templatePath word模板地址，完整路径，包括文件名。
     * @param temDir       生成临时文件存放地址，文件夹路径，不包括文件名。
     * @param fileName     文件名，可以不带后缀".docx"。
     * @param params       替换的参数
     * @param request      HttpServletRequest
     * @param response     HttpServletResponse
     */
    public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
        Assert.notNull(templatePath, "模板路径不能为空");
        Assert.notNull(temDir, "临时文件路径不能为空");
        Assert.notNull(fileName, "导出文件名不能为空");
        if (!fileName.endsWith(".docx")) {
            fileName = fileName + ".docx";
        }
        if (!temDir.endsWith(File.separator)) {
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        OutputStream out = null;
        FileOutputStream fos = null;
        try {
            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            }
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            String tmpPath = temDir + fileName;
            fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            // 设置强制下载不打开
            response.setContentType("application/force-download");
            // 设置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
            out = response.getOutputStream();
            doc.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            delFileWord(temDir, fileName);//这一步看具体需求，要不要删
            try {
                out.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 导出word（在非web环境下）
     * <p>第一步生成替换后的word文件，只支持docx</p>
     * <p>第二步下载生成的文件</p>
     * <p>第三步删除生成的临时文件</p>
     * 模版变量中变量格式：{{foo}}
     *
     * @param templatePath word模板地址，完整路径，包括文件名。
     * @param destDir      目标文件存放地址，文件夹路径，不包括文件名。
     * @param fileName     文件名，可以不带后缀".docx"。
     * @param params       替换的参数
     */
    public static void exportWord(String templatePath, String destDir, String fileName, Map<String, Object> params) throws IOException {
        Assert.notNull(templatePath, "模板路径不能为空");
        Assert.notNull(destDir, "临时文件路径不能为空");
        Assert.notNull(fileName, "导出文件名不能为空");
        if (!fileName.endsWith(".docx")) {
            fileName = fileName + ".docx";
        }
        if (!destDir.endsWith(File.separator)) {
            destDir = destDir + File.separator;
        }
        File dir = new File(destDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        String tmpPath = destDir + fileName;
        FileOutputStream fos = new FileOutputStream(tmpPath);
        try {
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            doc.write(fos);
            doc.close();
        } catch (Exception e) {
//            e.printStackTrace();
            // 如果写入失败，则把原文件另存为
            FileInputStream is = new FileInputStream(templatePath);
            XWPFDocument doc = new XWPFDocument(is);
            doc.write(fos);
            doc.close();
            is.close();
        }finally {
            fos.close();
        }
    }

    /**
     * 写入word document
     *
     * @param doc     word模板document
     * @param destDir 目标文件存放地址，文件夹路径，不包括文件名。
     * @param params  替换的参数
     */
    public static void exportWord(XWPFDocument doc, String destDir, Map<String, Object> params) throws Exception {
        Assert.notNull(doc, "模板文件不能为空");
        Assert.notNull(destDir, "临时文件路径不能为空");

        if (!destDir.endsWith(File.separator)) {
            destDir = destDir + File.separator;
        }
        File dir = new File(destDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        WordExportUtil.exportWord07(doc, params);
    }

    /**
     * 删除临时生成的文件
     *
     * @param filePath
     * @param fileName
     */
    private static void delFileWord(String filePath, String fileName) {
        File file = new File(filePath + fileName);
        File file1 = new File(filePath);
        file.delete();
        file1.delete();
    }
}
